/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package controladoras.apresentacao;
import entidades.Cliente;
import telas.TelaMenuCliente;
import telas.TelaGerenciaDados;
import javax.swing.JOptionPane;
import interfaces.IGerenciaCliente;
import erros.ErroPersistencia;
import erros.ErroRecuperacao;
import telas.TelaCadastroCliente;
/**
 * Classe que implementa a controladora de interação de cliente.
 * @author daniel saad
 */


public class CntrIntCliente {

    /**
     * Variavel de referencia para o objeto
     * singleton a ser criado.
     */
    private static CntrIntCliente ref;
    /**
     * Atributo utilizado para a chamada dos metodos definidos na tela
     * de cadastro de cliente.
     */
    private TelaCadastroCliente telaCadastroCliente;

    /**
     * Atributo utilizado para a chamada dos metodos definidos na tela
     * de menu cliente.
     */
    private TelaMenuCliente telaMenuCliente;
    /**
     * Atributo utilizado para a chamada dos metodos definidos na tela
     * de gerencia de dados.
     */
    private TelaGerenciaDados telaGerenciaDados;
    /**
     * Atributo utilizado para a chamada dos metodos definidos na interface
     * de gerencia de cliente.
     */
    private IGerenciaCliente cntrCadastroCliente;
    /**
     * Atributo cliente.
     */
    private Cliente cliente = new Cliente();

    /**
     * Metodo que chama a camada de negocio para logar o cliente.
     * @param cpf Cpf do cliente que esta logando.
     * @throws erros.ErroPersistencia Lança a exceção
     * se o cliente não estiver
     * cadastrado.
     */
    public final void logarCliente(final String cpf) throws ErroPersistencia {
        /*Validacao do CPF atraves do cliente*/
        Cliente clienteParam = new Cliente(cpf);
        try {
            this.cliente = cntrCadastroCliente.recuperarCliente(clienteParam);
            telaMenuCliente = new TelaMenuCliente();
            telaMenuCliente.setControladoraInteracao(this);
            telaMenuCliente.setNome(cliente.getNome());
            telaMenuCliente.setVisible(true);
        } catch (ErroRecuperacao e) {
            JOptionPane.showMessageDialog(telaMenuCliente,
                    "Cliente não cadastrado");
        }
    }

    /**
       * Metodo que instancia a controladora de interacao de cliente e
     * mostra a tela de gerencia de dados.
       */
    public final void gerenciaDados() {
        CntrIntCliente cntrIntCliente = CntrIntCliente.instanciar();
        cntrIntCliente.mostrarTelaGerenciaDados(cliente);
    }

    /**
    * Metodo que instancia a controladora de interacao de reserva e
     * mostra a tela gerencia de reserva.
    */

    public final void gerenciaReserva() {
        CntrIntReserva cntrIntReserva = CntrIntReserva.instanciar();
        cntrIntReserva.mostrarTelaGerenciaReserva(cliente);
    }

    /**
    * Metodo que instancia a controladora de interacao de voo
    * e mostra a tela de consulta de voo.
    */
    public final void consultaVoo() {
        CntrIntVoo cntrIntVoo = CntrIntVoo.instanciar();
        cntrIntVoo.mostrarTelaConsultaVoo();
    }

    /**
     * Metodo que dispara a apresentação a tela de cadastro de cliente.
     */
    public final void mostrarTelaCadastroCliente() {
        telaCadastroCliente = TelaCadastroCliente.instanciar();
        telaCadastroCliente.setControladoraInteracao(this);
        telaCadastroCliente.setFrameVisible(true);
    }

    /**
     * Metodo que dispara a apresentação a tela de gerencia de dados.
     */
    public final void mostrarTelaGerenciaDados(Cliente cliente) {
        telaGerenciaDados = new TelaGerenciaDados(this.cliente);
        telaGerenciaDados.setControladoraInteracao(this);
        telaGerenciaDados.setVisible(true);
    }


    /**
     * Metodo que chama a camada de negocio para realizar o cadastro de um
     * cliente.
     * @param nome Nome do cliente a ser cadastrado.
     * @param telefone Telefone do cliente a ser cadastrado.
     * @param cpf Cpf do cliente a ser cadastrado.
     */
    public final void cadastrarCliente(final String nome, final String telefone,
            final String cpf) {
        try {
            cliente = new Cliente(nome,telefone,cpf);
            /**
             * chama a controladora de negocio para cadastrar o cliente
             */
            cntrCadastroCliente.cadastrarCliente(cliente);
            JOptionPane.showMessageDialog(telaCadastroCliente,
                    "Cliente cadastrado.");
        } catch (Exception e) {
            JOptionPane.showMessageDialog(telaCadastroCliente, e.getMessage());
        }
    }

    public void editarCliente(final String nome, final String telefone,
            final String cpf) {
        try {
            Cliente clienteNovo = new Cliente(nome,telefone,cpf);
            cntrCadastroCliente.atualizarCliente(cliente, clienteNovo);
            cliente = clienteNovo;
            telaMenuCliente.setNome(cliente.getNome());
             JOptionPane.showMessageDialog(telaGerenciaDados,
                    "Dados atualizados.");
        } catch (Exception e) {
             JOptionPane.showMessageDialog(telaGerenciaDados,
                    e.getMessage());
        }
    }

    /**
     * Metodo que atribui uma controladora a outra.
     * @param cntrCadastroClienteParam controladora a ser atribuida.
     */
    public void setCntrCadastroCliente
            (IGerenciaCliente cntrCadastroClienteParam) {
        this.cntrCadastroCliente = cntrCadastroClienteParam;
    }
    /**
     * Metodo que implementa o padrao singleton da controladora
     * de itercao do cliente, dessa forma apenas uma instancia
     * da classe estara em execucao.
     * @return referencia para a contoladora de iteracao do cliente
     * singleton.
     */
    public static CntrIntCliente instanciar() {
        if (ref == null) {
            ref = new CntrIntCliente();
        }
        return (ref);
    }

    /**
     * Metodo que fecha a tela Cadastro Cliente.
     */
    public final void encerrarCadastroCliente() {
        telaCadastroCliente.setVisible(false);
    }

    /**
     * Metodo que fecha a tela Menu Cliente.
     */
    public final void encerrarMenuCliente() {
        telaMenuCliente.setVisible(false);
    }

    /**
     * Metodo que fecha a tela Gerencia de Dados.
     */
    public final void encerrarGerenciaDados() {
        telaGerenciaDados.setVisible(false);
    }

    /**
    * Método que retorna o atributo cliente desta classe.
    * @return cliente Atributo cliente da classe.
    */
    public final Cliente getCliente() {
        return(cliente);
    }
}
